<?php
namespace framework\driver\redis;

use \Redis;

/**
 * Redis 数据处理类
 */
class Helper
{
    /**
     * 连接实例
     *
     * @var \Redis
     */
    private $client;

    /**
     * 构造函数
     *
     * @param int $index
     */
    public function __construct($index)
    {
        $this->client = Manager::getInstance($index);
    }

    /**
     * 取得连接实例
     *
     * @return \Redis
     */
    function getClient()
    {
        return $this->client;
    }

    /**
     * 设置指定键名的数据
     *
     * @param string  $key
     * @param mixed   $value
     * @param int     $expiration
     * @return boolean
     */
    public function set($key, $value, $expiration = 0)
    {
        if ($expiration > 0)
        {
            return $this->client->setex($key, $expiration, $value);
        }
        else
        {
            return $this->client->set($key, $value);
        }
    }

    /**
     * 设置多个键名的数据
     *
     * @param array  $items <key => value>
     * @return boolean
     */
    public function setMulti($items)
    {
        return $this->client->mset($items);
    }

    /**
     * 获取指定键名的数据
     *
     * @param string  $key
     * @return mixed
     */
    public function get($key)
    {
        return $this->client->get($key);
    }

    /**
     * 获取指定键名序列的数据
     *
     * @param array  $keys
     * @return array
     */
    public function getMulti($keys)
    {
        $values = $this->client->getMultiple($keys);
        return array_combine($keys, $values);
    }

    /**
     * 增加指定键名的值并返回结果
     *
     * @param string $key
     * @param int    $step
     * @return int
     */
    public function increase($key, $step = 1)
    {
        return $this->client->incr($key, $step);
    }

    /**
     * 减少指定键名的值并返回结果
     *
     * @param string $key
     * @param int    $step
     * @return int
     */
    public function decrease($key, $step = 1)
    {
        return $this->client->decrBy($key, $step);
    }

    /**
     * 设置指定键名的数据并返回原数据
     *
     * @param string $key
     * @param mixed  $value
     * @return int
     */
    public function getSet($key, $value)
    {
        return $this->client->getSet($key, $value);
    }

    /**
     * 删除指定键名的数据
     *
     * @param string $key
     * @return boolean
     */
    public function delete($key)
    {
        return $this->client->delete($key);
    }

    /**
     * 判断指定键名是否存在
     *
     * @param string $key
     * @return boolean
     */
    public function exists($key)
    {
        return $this->client->exists($key);
    }

    /**
     * 设置指定哈希指定属性的数据
     *
     * @param string $key
     * @param string $prop
     * @param mixed  $value
     * @return boolean
     */
    public function hashSet($key, $prop, $value)
    {
        return $this->client->hSet($key, $prop, $value);
    }

    /**
     * 设置指定哈希多个属性的数据
     *
     * @param string  $key
     * @param array   $props <$prop => $value>
     * @return boolean
     */
    public function hashSetMulti($key, $props)
    {
        return $this->client->hMset($key, $props);
    }

    /**
     * 获取指定哈希指定属性的数据
     *
     * @param string $key
     * @param string $prop
     * @return mixed
     */
    public function hashGet($key, $prop)
    {
        return $this->client->hGet($key, $prop);
    }

    /**
     * 获取指定哈希多个属性的数据
     *
     * @param string $key
     * @param array  $props
     * @return array <$prop => $value>
     */
    public function hashGetMulti($key, $props)
    {
        return $this->client->hMGet($key, $props);
    }

    /**
     * 删除指定哈希指定属性的数据
     *
     * @param string $key
     * @param string $prop
     * @return boolean
     */
    public function hashDel($key, $prop)
    {
        return $this->client->hDel($key, $prop);
    }

    /**
     * 获取指定哈希的长度
     *
     * @param string $key
     * @return int
     */
    public function hashLength($key)
    {
        return $this->client->hLen($key);
    }

    /**
     * 获取指定哈希的所有属性
     *
     * @param string $key
     * @return array
     */
    public function hashProps($key)
    {
        return $this->client->hKeys($key);
    }

    /**
     *获取指定哈希的所有属性的值
     *
     * @param string $key
     * @return array
     */
    public function hashValues($key)
    {
        return $this->client->hVals($key);
    }

    /**
     * 获取指定哈希的所有属性和值
     *
     * @param string $key
     * @return array
     */
    public function hashGetAll($key)
    {
        return $this->client->hGetAll($key);
    }

    /**
     * 清空当前数据库
     *
     * @return boolean
     */
    public function flush()
    {
        return $this->client->flushDB();
    }

    /**
     * 获取服务器统计信息
     *
     * @return array
     */
    public function stat()
    {
        return $this->client->info();
    }
}

?>
